# 列表list
# 构建列表 形式[] 其中元素以" , "隔开    列表也是一个变量
# 列表是有顺序的一组值，顺序是从0位置开始
# 相关学习文档在：https://docs.python.org/3/tutorial/introduction.html#lists

names_str = ["A","B","C","D","E"]
print(names_str)

# 应用1：取值（从列表中取出字母）  从0开始取 各个字母所对应的位置数：A-0 B-1 C-2 D-3 E-4
print(names_str[0])  # 取出列表中的第一个值
print(names_str[4])  # 取出列表最后一个

# 应用2：一次取多个对应值
user_name_list = ["dog","cat","rabbit"]
password_list = [110,120,119]
user_data_list = ["D","C","R"]
usrr_age_list = [1,2,3]
# ......  还可以添加多个list

print(user_name_list[0])  # 一次取出每个列表中的第一个值
print(password_list[0])
print(user_data_list[0])
print(usrr_age_list[0])
# ......  同理也可以打印出多个

# 列表嵌套一
info_list = [["dog",110,"D"],["cat",120,"C"],["rabbit",119,"R"]]
print(info_list[1])   #  所得的值为['cat', 120, 'C']
# 列表嵌套二
a = ["a","b","c"]
b = ["1","2","3"]
x = [a,b]
print(x)
print(x[1])  # 得 [1,2,3]
print(x[0][1])  # 结果为b ,因为先在x中取出列表a[a,b,c]，再从列表a中取出位置数为1的值 b

# 数据结构之列表的切片
# 切片的查询
    # -4,-3,-2,-1,0,1,2,3 (只有正数才有0，而负数没有可以理解为在python中每个变量只能用一次，不能重复)
    # slices(切片)数值是指值（values）在list列表中的位置
names = ["A","B","C","D"]
# 取值有两种方法 单索引（单个值）  和  slice切片（多个或者单个值）
# 1. 正数即正向取值 从左到右
# 每个字符串所对应的位置数：A-0；B-1；C-2；D-3
print(names[2])  # 所取出的值为C
# 2. 负数即方向取值 从右到左
# 每个字符串所对应的位置数：A—— -4 ; B—— -3 ; C—— -2 ; D—— -1
print(names[-3])   # 所取出的值为B
# 3.特殊
# print(names[4]) # IndexError: list index out of range  所取的值不在列表范围内所以取不到 所以会报错

# 补充列表的单索引用法：与切片的规则一致
# 1.列表中的所有元素都有编号——从0开始递增
# 2.索引只一次只能取出一个值相对于列表来说
# 3.注意区分单索引索引和index() 函数的概念
list = ["A","B","C"]
print(list[1])

# 切片的另一种写法
names = ["A","B","C","D"]
# 1. 取所有的值
print(names[:]) # 若要从0开始取值 可以不用写0，python默认0开始取值
# 2. 正数（正向取值） 从左往右取值时，右边的值取不到
print(names[1:3])
# 3. 负数（方向取值） 从右往左取值时，右边的值取不到 且从取的数值位置大小来看 ，更大的值要放在右侧（-4：-2）
print(names[-3:-1])
# 4.若右侧不写任何值则可以取到右侧的值 最后一个值一定不能写0
print(names[2:])
print(names[-4:])

# 5. 特殊 可以指定 slice切片的步长 step
num_list = list(range(10))
print(num_list)
print(num_list[2:9:3]) # print(num_list[起始值：结束值：步长]  默认值为[0：表中的最大值：1]
# 所得结果为[0,1,2,3,4,5,6,7,8,9]
# 所得的值为 2，5，8
